<?php
define('BF_TIME_LAPS', (60*5)); // laps de temps
define('BF_DIR', 'bruteforce/'); // répertoire de stockage
define('BF_NB_TENTATIVE', 5); // 5 tentative tous les TIME_LAPS

class NoBF{ // No Brute Force

	public function  __construct() {
		/* */
	}

	/*
	 * Test si le nbr de tentative n'exède pas BF_NB_TENTATIVE
	* dans le laps de temps défini avec BF_TIME_LAPS
	*/
	static public function bruteCheck($email)
	{
		$filename = BF_DIR . $email . '.tmp';
		$deny_access = false;

		if(file_exists($filename))
		{
			$infos = NoBF::fileToArray($filename);

			$nb_tentatives = count($infos);
			$premiere_tentative = $infos[0];

			if($nb_tentatives < BF_NB_TENTATIVE)
				$deny_access = false;
			elseif($nb_tentatives > BF_NB_TENTATIVE && (BF_TIME_LAPS + $premiere_tentative) > time())
			$deny_access = true;
			else
				$deny_access = false;
		}

		return $deny_access;
	}


	static public function addTentative($email)
	{
		$filename = BF_DIR . $email . '.tmp';
		$date = time();

		if(file_exists($filename))
			$infos = NoBF::fileToArray($filename);
		else
			$infos = array();

		$infos[] = $date;


		NoBF::arrayToFile($filename, $infos);
	}



	/*
	 * Permet de supprimer les enregistrements trop anciens
	*/
	public function cleanUp($infos)
	{
		foreach($infos as $n => $date)
		{
			if((BF_TIME_LAPS + $date) < time())
				unset($infos[$n]);
		}

		return array_values($infos);
	}

	/*
	 * Récupère les infos du fichier et le sretourne unserialisé
	*/
	public function fileToArray($filename)
	{
		$infos = unserialize( file_get_contents($filename) );
		$infos = NoBF::cleanUp($infos);

		return $infos;
	}

	/*
	 * Enregistre les infos dans le fichier serialisé
	*/
	static public function arrayToFile($filename, $data)
	{
		$file = fopen ($filename, "w");
		fwrite($file, serialize($data) );
		fclose ($file);

		return true;
	}
}
?>